/*
 * $Id: ip.h,v 1.4 1993/06/30 05:45:25 jraja Exp $
 *
 * HISTORY
 * $Log: ip.h,v $
 * Revision 1.4  1993/06/30  05:45:25  jraja
 * Changed bitfield definitions to be more like ANSI-C.
 *
 * Revision 1.3  1993/03/05  03:20:01  ppessi
 * Compiles with SASC. Initial test version.
 *
 * Revision 1.2  93/03/03  21:39:09  21:39:09  jraja (Jarno Tapio Rajahalme)
 * Added #ifdef to prevent multiple inclusion.
 * 
 * Revision 1.1  92/11/17  16:29:25  16:29:25  jraja (Jarno Tapio Rajahalme)
 * Initial revision
 * 
 *
 */

/*
 * Copyright (c) 1982, 1986 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by the University of
 *      California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      @(#)ip.h        7.10 (Berkeley) 6/28/90
 */

/*
 * Definitions for internet protocol version 4.
 * Per RFC 791, September 1981.
 */
//MODULE 'netinet/in'

#define IPVERSION       4

/*
 * Structure of an internet header, naked of options.
 *
 * We declare ip_len and ip_off to be short, rather than u_short
 * pragmatically since otherwise unsigned comparisons can result
 * against negative integers quite easily, and fail in subtle ways.
 */

#define IP_DF $4000                    /* dont fragment flag */
#define IP_MF $2000                    /* more fragments flag */

OBJECT ip
    ip_v:UBYTE,                 /* version */
    ip_hl:UBYTE,                /* header length */
    ip_tos:UBYTE,                 /* type of service */
    ip_len:WORD,                 /* total length */
    ip_id:UWORD,                  /* identification */
    ip_off:WORD,                 /* fragment offset field */
    ip_ttl:UBYTE,                 /* time to live */
    ip_p:UBYTE,                   /* protocol */
    ip_sum:UWORD,                 /* checksum */
    ip_src:in_addr,
    ip_dst:in_addr               /* source and dest address */



#define IP_MAXPACKET    65535           /* maximum packet size */

/*
 * Definitions for IP type of service (ip_tos)
 */
#define IPTOS_LOWDELAY          $10
#define IPTOS_THROUGHPUT        $08
#define IPTOS_RELIABILITY       $04

/*
 * Definitions for IP precedence (also in ip_tos) (hopefully unused)
 */
#define IPTOS_PREC_NETCONTROL           $e0
#define IPTOS_PREC_INTERNETCONTROL      $c0
#define IPTOS_PREC_CRITIC_ECP           $a0
#define IPTOS_PREC_FLASHOVERRIDE        $80
#define IPTOS_PREC_FLASH                $60
#define IPTOS_PREC_IMMEDIATE            $40
#define IPTOS_PREC_PRIORITY             $20
#define IPTOS_PREC_ROUTINE              $10

/*
 * Definitions for options.
 */
#define IPOPT_COPIED(o)         ((o) & $80)
#define IPOPT_CLASS(o)          ((o) & $60)
#define IPOPT_NUMBER(o)         ((o) & $1f)

#define IPOPT_CONTROL           $00
#define IPOPT_RESERVED1         $20
#define IPOPT_DEBMEAS           $40
#define IPOPT_RESERVED2         $60

#define IPOPT_EOL               0               /* end of option list */
#define IPOPT_NOP               1               /* no operation */

#define IPOPT_RR                7               /* record packet route */
#define IPOPT_TS                68              /* timestamp */
#define IPOPT_SECURITY          130             /* provide s,c,h,tcc */
#define IPOPT_LSRR              131             /* loose source route */
#define IPOPT_SATID             136             /* satnet id */
#define IPOPT_SSRR              137             /* strict source route */

/*
 * Offsets to fields in options other than EOL and NOP.
 */
#define IPOPT_OPTVAL            0               /* option ID */
#define IPOPT_OLEN              1               /* option length */
#define IPOPT_OFFSET            2               /* offset within option */
#define IPOPT_MINOFF            4               /* min value of above */

/*
 * Time stamp option structure.
 */
OBJECT ip_timestamp
    ipt_code:UBYTE,               /* IPOPT_TS */
    ipt_len:UBYTE,                /* size of structure (variable) */
    ipt_ptr:UBYTE,                /* index of current entry */
    ipt_oflw:UBYTE,             /* overflow counter */
    ipt_flg:UBYTE,              /* flags, see below */
    [CUNION
        ipt_time[1]:ULONG,
        ipt_ta:ipt_ta_x
    ENDUNION]:ipt_timestamp

OBJECT ipt_ta_x
    ipt_addr:in_addr,
    ipt_time:ULONG

/* flag bits for ipt_flg */
#define IPOPT_TS_TSONLY         0               /* timestamps only */
#define IPOPT_TS_TSANDADDR      1               /* timestamps and addresses */
#define IPOPT_TS_PRESPEC        3               /* specified modules only */

/* bits for security (not byte swapped) */
#define IPOPT_SECUR_UNCLASS     $0000
#define IPOPT_SECUR_CONFID      $f135
#define IPOPT_SECUR_EFTO        $789a
#define IPOPT_SECUR_MMMM        $bc4d
#define IPOPT_SECUR_RESTR       $af13
#define IPOPT_SECUR_SECRET      $d788
#define IPOPT_SECUR_TOPSECRET   $6bc5

/*
 * Internet implementation parameters.
 */
#define MAXTTL          255             /* maximum time to live (seconds) */
#define IPFRAGTTL       60              /* time to live for frags, slowhz */
#define IPTTLDEC        1               /* subtracted when forwarding */

#define IP_MSS          576             /* default maximum segment size */


